<?php

  /**
   * Authority
   *
   * ORM для таблицы авторитетности пользователей
   *
   * @property string $table   название таблицы ('posts','comments')
   * @property int    $rec_id  идентификатор оцениваемой записи
   * @property string $score   оценка ('plus','minus','complaint')
   * @method Authority posts()    выборка оцененных постов
   * @method Authority comments() выборка оцененных комментов
   */

  final class Authority extends UserRecord
  {
  // возможные оценки
    const PLUS      = "plus";
    const MINUS     = "minus";
    const COMPLAINT = "complaint";

    /**
     * вернуть экземпляр модели
     *
     * @return Authority
     * @access public
     */
    public static function model($className = __CLASS__)
    {
      return parent::model($className);
    }

    /**
     * вернуть имя таблицы
     *
     * @return string
     * @access public
     */
    public function tableName()
    {
      return "authority";
    }

    /**
     * правила проверки атрибутов модели
     *
     * @return array[]
     * @access public
     */
    public function rules()
    {
      return array(
        array("table", "in", "range" => $this->enum("table"), "allowEmpty" => false),
        array("rec_id", "exists", "className" => strcasecmp($this->table, Comment::POSTS) ? "Comment" : "Post", "allowEmpty" => false),
        array("score", "in", "range" => $this->enum("score"), "allowEmpty" => false)
      ) + parent::rules();
    }

    /**
     * наборы фильтров для выборки
     *
     * @return array[]
     * @access public
     */
    public function scopes()
    {
      return $this->enumScopes("table") + parent::scopes();
    }

    /**
     * вернуть уровень авторитетности, выставленный авторизованным пользователем
     *
     * @param int    $recId идентификатор записи
     * @param string $table название таблицы, содержащей запись
     * @return string ("", "plus", "minus", "complaint")
     * @access public
     */
    public function userScore($recId, $table = Comment::POSTS)
    {
      /** @var $user CWebUser */
      $user = $this->app->user;
      if (!$user->isGuest)
        /** @var $row Authority */
        if ($row = $this->findByPk(array("user_id" => $user->id, "table" => $table, "rec_id" => $recId)))
          return $row->score;

      return "";
    }
  }

?>
